/*
 * 组合模式听说去很玄乎，其实也并不复杂。为什么?大家可以先想一下数据结构里面的二叉树是怎么回事。
 * 
 * 为什么就是这么一个简单的二叉树节点既可能是叶节点，也可能是父节点?
 */

typedef struct node
{
	void * pdata;
	struct node * left;
	struct node * right;
}node;

/*
 * 那什么时候是叶子节点，其实就是left、right为NULL的时候。那么如果它们不是NULL呢，
 * 
 * 那么很明显此时它们已经是父节点了。那么，我们的这个组合模式是怎么一个情况呢？
 */
typedef struct object
{
	struct object ** ppobject;
	int number;
	void (*operate)(struct object pobject);
}object;

/*
 * 就是这么一个简单的数据结构，是怎么实现子节点和父节点的差别呢。
 *
 * 比如说，现在我们需要对一个父节点的operate进行操作，此时的operate函数应该怎么操作呢？
 */
void operate_of_parent(struct object * pobject)
{
	int index;
	assert(NULL != pobject);
	assert(NULL != pobject->ppobject && 0 != pobject->number);

	for (index = 0; index < pobject->number; index++)
		pobject->ppobject[index]->operate(pobject->ppobject[index]);
}

/*
 *  当然，有了parent的operate，也有child的operate。至于是什么操作，那就看自己是怎么操作的了
 */
void operate_of_child(struct object * pobject)
{
	assert(NULL != pobject);
	printf("child node\n");
}

/*
 * 父节点也好，子节点也罢，一切的一切都是最后的应用。其实，用户的调用也非常简单，就这么一个简单的函数
 */
void process(struct object * pobject)
{
	assert(NULL != pobject);
	pobject->operate(pobject);
}

